Karten bauen! 🗺️

Linguistic Landscapes, 2023

Sarah Warchhold & Susan Reichelt

Plan

Ziel der Sitzung

Was gemacht werden muss

  1. Rückschau: ggplot2
  2. Datenkartierung - warum und wie überhaupt?
  3. Was ist OSM
  4. OSM Objekte schichten
  5. LL Daten kartieren
    1. Ebenen erstellen
    2. Ebenen zusammensetzen
    3. Style

Rückschau: ggplot2

  • ggplot2 erstellt Visualisierungen über grafische Ebenen, sog. geoms, und diverse stilistische Anpassungen, bspw. themes, colours, scales, etc.

  • Die Visualisierung beruft sich hierbei auf einen bestehenden Dataframe und aktivierte Variablen (x, y, fill, colour, size, etc.).

  • Der Basis-Code ist: ggplot( ) + geom_…( )

  • Als erstes benötigen wir tidyverse & unsere Daten

    library(tidyverse)
    lingland <- read_csv("LingLand.csv")

Beispiel: Scatterplot

ggplot() +
  geom_point(data=lingland,
             aes(x=long,
                 y=lat))

Beispiel: Scatterplot

ggplot() +
  geom_point(data=lingland,
             aes(x=long,
                 y=lat),
             shape=21,
             color="black",
             alpha=.4)

Beispiel: Scatterplot

ggplot() +
  geom_point(data=lingland,
             aes(x=long,
                 y=lat,
                 fill=Format),
             shape=21,
             alpha=.4)

Beispiel: Scatterplot

ggplot() +
  geom_point(data=lingland,
             aes(x=long,
                 y=lat,
                 fill=Forschungsfokus),
             shape=21,
             alpha=.7) +
  scale_fill_manual(values=c("#FFBE0B",
                             "#FF006E",
                             "#8338EC",
                             "#3A86FF"))+
  theme_classic()+
  labs(title="Datenpunkte",
       subtitle="Linguistic Landscapes, 2023",
       x="Längengrad",
       y="Breitengrad",
       caption="Daten aus dem Seminar")

Datenkartierung - warum und wie überhaupt?

Datenkartierung hilft uns Zusammenhänge zwischen Kategorien und Raum zu erkennen. Beispielsweise könnten uns Straßenführungen oder Parkanlagen Aufschluss über die spezielle Verteilung unserer Datenpunkte geben.
Hierzu kann man die offenen Daten des OSM Projektes nutzen.

Was ist OSM?

OSM, Open Street Maps, ist eine crowdsourcing Initiative, bei der diverse Geodaten gebündelt und bereitgestellt werden.

openstreetmap.org

Über die Objektabfrage (Cursor mit Fragezeichen) lassen sich Karteninhalte überprüfen - beispielsweise alle hinterlegten Informationen zur Alten Rheinbrücke.

openstreetmap.org

Karteninhalte lassen sich als Einzelobjekte aus OSM extrahieren und dann variabel zusammensetzen. Hierzu ist es wichtig die jeweiligen Referenzen zu kennen:

  1. key - obere Kategorie (Bsp. water)

  2. values - zugehörige untere Kategorien (Bsp. lake)

OSM Objekte schichten

Um die Karte zu erstellen, schichten wir Objekte, die bestimmte Geo-Daten zusammenfassen:

  • Wasser
  • Grünflächen
  • Gebäude
  • Straßen &
  • Grenze


LL Daten kartieren

Packages, die installiert werden müssen:

install.packages("osmdata")
install.packages("sf")
install.packages("ggmap")

library(osmdata)
library(sf)
library(ggmap)

Ebenen erstellen

In den nächsten Folien zeigen wir wie sich die Objekterstellung zusammensetzt - führen Sie die Codezeilen einfach im Skript aus!

(Die Visualisierungen sind hier kurze Einblicke für die Folien und gehören nicht zum Code Output!)

KN_Strasse1 <- getbb("Konstanz") %>% 
  opq() %>% 
  add_osm_feature(key = "highway", 
                  value = c("motorway", 
                            "trunk", 
                            "primary", 
                            "motorway_link",
                            "primary_link", 
                            "motorway_junction")) %>% 
  osmdata_sf()

KN_Strasse2 <- getbb("Konstanz") %>% 
  opq() %>% 
  add_osm_feature(key = "highway", 
                  value = c("secondary", 
                            "secondary_link", 
                            "mini_roundabout",
                            "bus_guideway",
                            "busway","road","tertiary",
                            "tertiary_link","unclassified")) %>% 
  osmdata_sf()

KN_Strasse3 <- getbb("Konstanz") %>% 
  opq() %>% 
  add_osm_feature(key = "highway", 
                  value = c("residential", 
                            "living_street",
                            "service", 
                            "pedestrian", 
                            "track", "cycleway", 
                            "footway", "path")) %>%
  osmdata_sf()

KN_Bruecke <- getbb("Konstanz") %>% 
  opq() %>% 
  add_osm_feature(key = "man_made", 
                  value = c("bridge", 
                            "pier", 
                            "embankment")) %>% 
  osmdata_sf()

KN_Bahn <- getbb("Konstanz") %>%
  opq() %>%
  add_osm_feature(key = "railway", 
                  value="rail") %>% 
  osmdata_sf()

KN_Wasser <- getbb("Konstanz") %>% 
  opq() %>% 
  add_osm_feature(key = "water", 
                  value = c("river", 
                            "lake", 
                            "canal", 
                            "pond",
                            "harbour")) %>% 
  osmdata_sf()

KN_Wasser2 <- getbb("Konstanz") %>% 
  opq() %>% 
  add_osm_feature(key = "natural", 
                  value = c("water")) %>% 
  osmdata_sf()

KN_Wasserweg <- getbb("Konstanz")%>%
  opq() %>% 
  add_osm_feature(key = "waterway", 
                  value= c("river", 
                           "stream")) %>% 
  osmdata_sf()

Weitere Objekte im Skript!

Führen Sie die weiteren Objekte aus dem Skript aus:

  • Insel

  • Gebäude

  • Grünflächen

  • Grenze

Ebenen zusammensetzen

Die Objekte lassen sich nun aufeinander schichten.

Achtung: die Reihenfolge ist wichtig!

Karte von Konstanz

Karte <- ggplot() +
  geom_sf(data=KN_Wasserweg$osm_lines, 
          inherit.aes = FALSE, 
          color = "#15616D",
          size=.8) + 
  geom_sf(data=KN_Wasser$osm_multipolygons, 
          inherit.aes = FALSE, 
          fill = "#15616D",
          color="#15616D") + 
  geom_sf(data=KN_Wasser2$osm_polygons, 
          inherit.aes = FALSE, 
          fill = "#15616D",
          color="#15616D") + 
  geom_sf(data=KN_Insel$osm_polygons, 
          inherit.aes = FALSE, 
          fill = "white", 
          colour="NA") +
  geom_sf(data=KN_buildings$osm_polygons,
          inherit.aes = FALSE, 
          alpha=.5,
          fill = "mistyrose4",
          colour = "NA") +
  geom_sf(data=KN_Bruecke$osm_polygons, 
          inherit.aes=FALSE, 
          color=NA, 
          fill="grey3") +
  geom_sf(data = KN_Strasse1$osm_lines, 
          inherit.aes = FALSE, 
          color = "grey3",
          linewidth = .5) +
  geom_sf(data = KN_Strasse1$osm_polygons, 
          inherit.aes = FALSE, 
          color = "grey3",
          fill="grey3",
          linewidth = .5) +
  geom_sf(data = KN_Strasse2$osm_lines, 
          inherit.aes = FALSE, 
          color = "grey2",
          linewidth = .35) +
  geom_sf(data = KN_Strasse2$osm_polygons, 
          inherit.aes = FALSE, 
          color = "grey2",
          fill="grey2",
          linewidth = .35) +
  geom_sf(data = KN_Strasse3$osm_lines, 
          inherit.aes = FALSE, 
          color = "grey2",
          linewidth = .2) +
  geom_sf(data = KN_Strasse3$osm_polygons, 
          inherit.aes = FALSE, 
          color = "grey2",
          fill=NA,
          linewidth = .2)+ 
  geom_sf(data = KN_Bahn$osm_lines,
          inherit.aes = FALSE,
          color = "gray1",
          linewidth = .3, 
          linetype="longdash") +
  # geom_sf(data= KN_Grenze$osm_lines,
  #         inherit.aes = FALSE,
  #         color= "#ffecd1",
  #         linewidth = 1,
  #         alpha = .6,
  #         linetype="dotted") +
  coord_sf(xlim = c(9.15, 9.221), 
           ylim = c(47.655, 47.694))

Karte

mit unseren gesammelten Daten

Karte + 
  geom_point(data=lingland,
             aes(x=long,
                 y=lat),
             shape=21,
             fill="mediumvioletred",
             color="black",
             alpha=.7)

und mit Style!

Karte + 
  geom_point(data=lingland,
             aes(x=long,
                 y=lat),
             shape=21,
             fill="mediumvioletred",
             color="black",
             alpha=.7) +
  labs(title="Datensammlung",
       subtitle="Seminar zu Linguistic Landscapes, 2023",
       caption="Karte: OSM") +
  theme(plot.title = element_text(vjust=2.5),
        plot.subtitle =element_text(vjust=2.5))+
  theme_void()

Und jetzt Sie!

  1. Probieren Sie einmal unseren Datensatz auf der Karte nach Kategorien farblich zu markieren (Tipp: Scrollen Sie hierzu zurück zum Beginn der Sitzung).

  2. Probieren Sie einmal eine Karte nur vom Campus zu erstellen!